﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Siser.Web.Models;
using System.Drawing.Imaging;
using System.Diagnostics;
using System.Collections;
using System.Configuration;
using System.IO;
//using Siser.Web.Models.JsonResponses;


namespace Siser.Web.Controllers
{
    public class ReporteController : Controller
    {
        private SiserEntities db = new SiserEntities();
        

        public ActionResult Index()
        {

            return View();
        }

//--------------------------------------------------------------------------------------------------------------------------------------------------------------
        //TOMAR ESTO


        public ActionResult reportedealarmas()
        {
            ViewBag.instalacion = new SelectList(db.Instalaciones, "Id", "Nombre");
            return View();
        }
        
        public ActionResult reporteambiental(int? idArea, int? idEmpresa, int? idRegion)
        {
            if (idArea != null && idEmpresa != null && idRegion != null)
            {
                ViewBag.bloqueo = 1;
                ViewBag.idArea = idArea;
                ViewBag.idEmpresa = idEmpresa;
                ViewBag.idRegion = idRegion;
                ViewBag.region = new SelectList(db.Regiones, "Id", "Nombre", idRegion);
                ViewBag.empresa = new SelectList(db.Empresas, "Id", "Nombre", idEmpresa);
                ViewBag.area = new SelectList(db.Plantas, "Id", "Nombre", idArea);
            }
            else
            {
                ViewBag.bloqueo = 0;
                ViewBag.region = new SelectList(db.Regiones, "Id", "Nombre");
                ViewBag.empresa = new SelectList(db.Empresas, "Id", "Nombre");
                ViewBag.area = new SelectList(db.Plantas, "Id", "Nombre");
            }
            return View();
        }


        public ActionResult reporteambiental1(CReporteAmbiental ambiental)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    DateTime fechaI = Convert.ToDateTime(ambiental.fechaInicio);
                    DateTime fechaF = Convert.ToDateTime(ambiental.fechaFin);
                    var instalaciones = (from instalacion in db.Instalaciones where instalacion.PlantaId == ambiental.area select instalacion.Id);//area ahora es int y es igual a planta
                    ArrayList ids = new ArrayList();
                    foreach (int id in instalaciones)
                    {
                        ids.Add(id);
                    }
                    ArrayList i_equipos = new ArrayList();
                    foreach (int id in ids)
                    {

                        var id_equipos = (from equipo in db.Equipos where equipo.InstalacionId == id && (equipo.SistemaId == 2 || equipo.SistemaId==7) select equipo.Id);
                        foreach (int d in id_equipos)
                        {
                            i_equipos.Add(d);
                        }
                    }


                    ArrayList id_piezas1 = new ArrayList();
                    foreach (int id_equipo in i_equipos)
                    {
                        var id_eq_pieza = (from equipos_p in db.EquiposPiezas where equipos_p.EquipoId == id_equipo select equipos_p.PiezaId);
                        
                        foreach (int val in id_eq_pieza)
                        {
                            id_piezas1.Add(val);
                            Debug.WriteLine(val.ToString());
                            
                        }

                    }

                    //--------------------
                    string datos = "";
                    ArrayList vectores = new ArrayList();
                    // vectores.Add("['01/01/2012 00:00:00',0,0]]");
                    foreach (int dato_id in id_piezas1)
                    {

                        List<Medicion> mediciones = db.Mediciones.Where(m => m.Fecha >= fechaI
                                    && m.Fecha <= fechaF && m.PiezaId == dato_id && m.RegistroMedida == "F").ToList<Medicion>();
                        datos = "[";
                        foreach (Medicion medicion in mediciones)
                        {
                            datos += "[\'" + medicion.Fecha.ToString("yyyy/MM/dd HH:MM:ss") + "\'," + medicion.Valor.ToString() + "],";

                        }
                        datos = datos.TrimEnd(',') + "]";
                        vectores.Add(datos);

                    }

                    if (id_piezas1.Count == 0)
                    {
                        Response.Redirect(Url.Action("../reporte/SinInformacion"));
                        return null;
                    }

                        int reg1 = Convert.ToInt16(id_piezas1[0]);
                        var nom = (from pieza in db.Piezas where pieza.Id == reg1 select pieza.Nombre).ToList();
                        string nom1 = Convert.ToString(nom[0]);
                        List<Medicion> mediciones1 = db.Mediciones.Where(m => m.Fecha >= fechaI
                                            && m.Fecha <= fechaF && m.PiezaId == reg1 && m.RegistroMedida == "F").ToList<Medicion>();


                        decimal maximo1 = (decimal)(from medicioness1 in db.Mediciones
                                                    where medicioness1.Fecha >= fechaI
                                                        && medicioness1.Fecha <= fechaF && medicioness1.PiezaId == reg1
                                                        && medicioness1.RegistroMedida == "F"
                                                    select medicioness1.Valor).Max();
                        decimal minimo1 = (decimal)(from medicioness1 in db.Mediciones
                                                    where medicioness1.Fecha >= fechaI
                                                        && medicioness1.Fecha <= fechaF && medicioness1.PiezaId == reg1
                                                        && medicioness1.RegistroMedida == "F"
                                                    select medicioness1.Valor).Min();

                        ViewBag.maximo1 = maximo1.ToString("#.00");
                        ViewBag.minimo1 = minimo1.ToString("#.00");

                        decimal valor_suma = 0.000M;
                        int n = 0;
                        foreach (Medicion medicion in mediciones1)
                        {
                            valor_suma += (decimal)medicion.Valor;
                            n++;
                        }
                        decimal promedio = valor_suma / n;
                        decimal valor_cuadrado = 0.000M;
                        n = 0;
                        foreach (Medicion medicion in mediciones1)
                        {
                            valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                            n++;
                        }
                        decimal varianza = valor_cuadrado / n;
                        decimal desviacion_est = (decimal)Math.Sqrt((double)varianza);

                        ViewBag.id1 = reg1;
                        ViewBag.nom = nom1;
                        ViewBag.totaldatos1 = n.ToString();
                        ViewBag.promedio1 = promedio.ToString("#.00");
                        ViewBag.varianza1 = varianza.ToString("#.00");
                        ViewBag.desviacion1 = desviacion_est.ToString("#.00");

                        //-----------------------
                        if (id_piezas1.Count >= 2)
                        {

                            int reg2 = Convert.ToInt16(id_piezas1[1]);
                            var nom2 = (from pieza in db.Piezas where pieza.Id == reg2 select pieza.Nombre).ToList();
                            string nom_2 = Convert.ToString(nom2[0]);

                            List<Medicion> mediciones2 = db.Mediciones.Where(m => m.Fecha >= fechaI
                                                && m.Fecha <= fechaF && m.PiezaId == reg2 && m.RegistroMedida == "F").ToList<Medicion>();

                            decimal maximo2 = (decimal)(from medicioness2 in db.Mediciones
                                                        where medicioness2.Fecha >= fechaI
                                                           && medicioness2.Fecha <= fechaF && medicioness2.PiezaId == reg2
                                                           && medicioness2.RegistroMedida == "F"
                                                        select medicioness2.Valor).Max();
                            decimal minimo2 = (decimal)(from medicioness2 in db.Mediciones
                                                        where medicioness2.Fecha >= fechaI
                                                           && medicioness2.Fecha <= fechaF && medicioness2.PiezaId == reg2
                                                           && medicioness2.RegistroMedida == "F"
                                                        select medicioness2.Valor).Min();

                            ViewBag.maximo2 = maximo2.ToString("#.00");
                            ViewBag.minimo2 = minimo2.ToString("#.00");

                            valor_suma = 0.000M;
                            n = 0;
                            foreach (Medicion medicion in mediciones2)
                            {
                                valor_suma += (decimal)medicion.Valor;
                                n++;
                            }
                            promedio = valor_suma / n;
                            valor_cuadrado = 0.000M;
                            n = 0;
                            foreach (Medicion medicion in mediciones2)
                            {
                                valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                                n++;
                            }
                            varianza = valor_cuadrado / n;
                            desviacion_est = (decimal)Math.Sqrt((double)varianza);

                            ViewBag.id2 = reg2;
                            ViewBag.nomb2 = nom_2;
                            ViewBag.totaldatos2 = n.ToString();
                            ViewBag.promedio2 = promedio.ToString("#.00");
                            ViewBag.varianza2 = varianza.ToString("#.00");
                            ViewBag.desviacion2 = desviacion_est.ToString("#.00");

                            //---------------------------------
                            if (id_piezas1.Count >= 3)
                            {

                                int reg3 = Convert.ToInt16(id_piezas1[2]);
                                var nom3 = (from pieza in db.Piezas where pieza.Id == reg3 select pieza.Nombre).ToList();
                                string nom_3 = Convert.ToString(nom3[0]);
                                List<Medicion> mediciones3 = db.Mediciones.Where(m => m.Fecha >= fechaI
                                                    && m.Fecha <= fechaF && m.PiezaId == reg3 && m.RegistroMedida == "F").ToList<Medicion>();

                                decimal maximo3 = (decimal)(from medicioness3 in db.Mediciones
                                                            where medicioness3.Fecha >= fechaI
                                                               && medicioness3.Fecha <= fechaF && medicioness3.PiezaId == reg3
                                                               && medicioness3.RegistroMedida == "F"
                                                            select medicioness3.Valor).Max();
                                decimal minimo3 = (decimal)(from medicioness3 in db.Mediciones
                                                            where medicioness3.Fecha >= fechaI
                                                               && medicioness3.Fecha <= fechaF && medicioness3.PiezaId == reg3
                                                               && medicioness3.RegistroMedida == "F"
                                                            select medicioness3.Valor).Min();

                                ViewBag.maximo3 = maximo3.ToString("#.00");
                                ViewBag.minimo3 = minimo3.ToString("#.00");

                                valor_suma = 0.000M;
                                n = 0;
                                foreach (Medicion medicion in mediciones3)
                                {
                                    valor_suma += (decimal)medicion.Valor;
                                    n++;
                                }
                                promedio = valor_suma / n;
                                valor_cuadrado = 0.000M;
                                n = 0;
                                foreach (Medicion medicion in mediciones3)
                                {
                                    valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                                    n++;
                                }
                                varianza = valor_cuadrado / n;
                                desviacion_est = (decimal)Math.Sqrt((double)varianza);

                                ViewBag.id3 = reg3;
                                ViewBag.nomb3 = nom_3;
                                ViewBag.totaldatos3 = n.ToString();
                                ViewBag.promedio3 = promedio.ToString("#.00");
                                ViewBag.varianza3 = varianza.ToString("#.00");
                                ViewBag.desviacion3 = desviacion_est.ToString("#.00");

                                //---------------------------------

                                if (id_piezas1.Count >= 4)
                                {
                                    int reg4 = Convert.ToInt16(id_piezas1[3]);
                                    var nom4 = (from pieza in db.Piezas where pieza.Id == reg4 select pieza.Nombre).ToList();
                                    string nom_4 = Convert.ToString(nom4[0]);
                                    List<Medicion> mediciones4 = db.Mediciones.Where(m => m.Fecha >= fechaI
                                                        && m.Fecha <= fechaF && m.PiezaId == reg4 && m.RegistroMedida == "F").ToList<Medicion>();

                                    decimal maximo4 = (decimal)(from medicioness4 in db.Mediciones
                                                                where medicioness4.Fecha >= fechaI
                                                                   && medicioness4.Fecha <= fechaF && medicioness4.PiezaId == reg4
                                                                   && medicioness4.RegistroMedida == "F"
                                                                select medicioness4.Valor).Max();
                                    decimal minimo4 = (decimal)(from medicioness4 in db.Mediciones
                                                                where medicioness4.Fecha >= fechaI
                                                                   && medicioness4.Fecha <= fechaF && medicioness4.PiezaId == reg4 
                                                                   && medicioness4.RegistroMedida == "F"
                                                                select medicioness4.Valor).Min();

                                    ViewBag.maximo4 = maximo4.ToString("#.00");
                                    ViewBag.minimo4 = minimo4.ToString("#.00");

                                    valor_suma = 0.000M;
                                    n = 0;
                                    foreach (Medicion medicion in mediciones4)
                                    {
                                        valor_suma += (decimal)medicion.Valor;
                                        n++;
                                    }
                                    promedio = valor_suma / n;
                                    valor_cuadrado = 0.000M;
                                    n = 0;
                                    foreach (Medicion medicion in mediciones4)
                                    {
                                        valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                                        n++;
                                    }
                                    varianza = valor_cuadrado / n;
                                    desviacion_est = (decimal)Math.Sqrt((double)varianza);

                                    ViewBag.id4 = reg4;
                                    ViewBag.nomb4 = nom_4;
                                    ViewBag.totaldatos4 = n.ToString();
                                    ViewBag.promedio4 = promedio.ToString("#.00");
                                    ViewBag.varianza4 = varianza.ToString("#.00");
                                    ViewBag.desviacion4 = desviacion_est.ToString("#.00");

                                    //---------------------------------

                                    if (id_piezas1.Count >= 5)
                                    {
                                        int reg5 = Convert.ToInt16(id_piezas1[4]);
                                        var nom5 = (from pieza in db.Piezas where pieza.Id == reg5 select pieza.Nombre).ToList();
                                        string nom_5 = Convert.ToString(nom5[0]);
                                        List<Medicion> mediciones5 = db.Mediciones.Where(m => m.Fecha >= fechaI
                                                            && m.Fecha <= fechaF && m.PiezaId == reg5 && m.RegistroMedida == "F").ToList<Medicion>();

                                        decimal maximo5 = (decimal)(from medicioness5 in db.Mediciones
                                                                    where medicioness5.Fecha >= fechaI
                                                                       && medicioness5.Fecha <= fechaF && medicioness5.PiezaId == reg5
                                                                       && medicioness5.RegistroMedida == "F"
                                                                    select medicioness5.Valor).Max();
                                        decimal minimo5 = (decimal)(from medicioness5 in db.Mediciones
                                                                    where medicioness5.Fecha >= fechaI
                                                                       && medicioness5.Fecha <= fechaF && medicioness5.PiezaId == reg5
                                                                       && medicioness5.RegistroMedida == "F"
                                                                    select medicioness5.Valor).Min();

                                        ViewBag.maximo5 = maximo5.ToString("#.00");
                                        ViewBag.minimo5 = minimo5.ToString("#.00");

                                        valor_suma = 0.000M;
                                        n = 0;
                                        foreach (Medicion medicion in mediciones5)
                                        {
                                            valor_suma += (decimal)medicion.Valor;
                                            n++;
                                        }
                                        promedio = valor_suma / n;
                                        valor_cuadrado = 0.000M;
                                        n = 0;
                                        foreach (Medicion medicion in mediciones5)
                                        {
                                            valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                                            n++;
                                        }
                                        varianza = valor_cuadrado / n;
                                        desviacion_est = (decimal)Math.Sqrt((double)varianza);

                                        ViewBag.id5 = reg5;
                                        ViewBag.nomb5 = nom_5;
                                        ViewBag.totaldatos5 = n.ToString();
                                        ViewBag.promedio5 = promedio.ToString("#.00");
                                        ViewBag.varianza5 = varianza.ToString("#.00");
                                        ViewBag.desviacion5 = desviacion_est.ToString("#.00");
                                        //---------------

                                        if (id_piezas1.Count >= 6)
                                        {
                                            int reg6 = Convert.ToInt16(id_piezas1[5]);
                                            var nom6 = (from pieza in db.Piezas where pieza.Id == reg6 select pieza.Nombre).ToList();
                                            string nom_6 = Convert.ToString(nom6[0]);
                                            List<Medicion> mediciones6 = db.Mediciones.Where(m => m.Fecha >= fechaI
                                                                && m.Fecha <= fechaF && m.PiezaId == reg6 && m.RegistroMedida == "F").ToList<Medicion>();

                                            decimal maximo6 = (decimal)(from medicioness6 in db.Mediciones
                                                                        where medicioness6.Fecha >= fechaI
                                                                           && medicioness6.Fecha <= fechaF && medicioness6.PiezaId == reg6
                                                                           && medicioness6.RegistroMedida == "F"
                                                                        select medicioness6.Valor).Max();
                                            decimal minimo6 = (decimal)(from medicioness6 in db.Mediciones
                                                                        where medicioness6.Fecha >= fechaI
                                                                           && medicioness6.Fecha <= fechaF && medicioness6.PiezaId == reg6
                                                                           && medicioness6.RegistroMedida == "F"
                                                                        select medicioness6.Valor).Min();

                                            ViewBag.maximo6 = maximo6.ToString("#.00");
                                            ViewBag.minimo6 = minimo6.ToString("#.00");

                                            valor_suma = 0.000M;
                                            n = 0;
                                            foreach (Medicion medicion in mediciones6)
                                            {
                                                valor_suma += (decimal)medicion.Valor;
                                                n++;
                                            }
                                            promedio = valor_suma / n;
                                            valor_cuadrado = 0.000M;
                                            n = 0;
                                            foreach (Medicion medicion in mediciones6)
                                            {
                                                valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                                                n++;
                                            }
                                            varianza = valor_cuadrado / n;
                                            desviacion_est = (decimal)Math.Sqrt((double)varianza);

                                            ViewBag.id6 = reg6;
                                            ViewBag.nomb_6 = nom_6;
                                            ViewBag.totaldatos6 = n.ToString();
                                            ViewBag.promedio6 = promedio.ToString("#.00");
                                            ViewBag.varianza6 = varianza.ToString("#.00");
                                            ViewBag.desviacion6 = desviacion_est.ToString("#.00");

                                        }//if6
                                        else
                                        {//llevar 6 a 0
                                            ViewBag.maximo6 = "---";
                                            ViewBag.minimo6 = "---";
                                            ViewBag.id6 = "---";
                                            ViewBag.totaldatos6 = "---";
                                            ViewBag.promedio6 = "---";
                                            ViewBag.varianza6 = "---";
                                            ViewBag.desviacion6 = "---";
                                        }

                                    }//if5
                                    else
                                    {
                                        //mandar 5,6 a 0
                                        ViewBag.maximo6 = "---";
                                        ViewBag.minimo6 = "---";
                                        ViewBag.id6 = "---";
                                        ViewBag.totaldatos6 = "---";
                                        ViewBag.promedio6 = "---";
                                        ViewBag.varianza6 = "---";
                                        ViewBag.desviacion6 = "---";

                                        ViewBag.maximo5 = "---";
                                        ViewBag.minimo5 = "---";
                                        ViewBag.id5 = "---";
                                        ViewBag.totaldatos5 = "---";
                                        ViewBag.promedio5 = "---";
                                        ViewBag.varianza5 = "---";
                                        ViewBag.desviacion5 = "---";

                                    }
                                }//if4
                                else
                                {
                                    //mandar 4,5,6 a 0
                                    ViewBag.maximo6 = "---";
                                    ViewBag.minimo6 = "---";
                                    ViewBag.id6 = "---";
                                    ViewBag.totaldatos6 = "---";
                                    ViewBag.promedio6 = "---";
                                    ViewBag.varianza6 = "---";
                                    ViewBag.desviacion6 = "---";

                                    ViewBag.maximo5 = "---";
                                    ViewBag.minimo5 = "---";
                                    ViewBag.id5 = "---";
                                    ViewBag.totaldatos5 = "---";
                                    ViewBag.promedio5 = "---";
                                    ViewBag.varianza5 = "---";
                                    ViewBag.desviacion5 = "---";

                                    ViewBag.maximo4 = "---";
                                    ViewBag.minimo4 = "---";
                                    ViewBag.id4 = "---";
                                    ViewBag.totaldatos4 = "---";
                                    ViewBag.promedio4 = "---";
                                    ViewBag.varianza4 = "---";
                                    ViewBag.desviacion4 = "---";
                                }

                            }//if3
                            else
                            {
                                //mandar 3,4,5,6 a 0
                                ViewBag.maximo6 = "---";
                                ViewBag.minimo6 = "---";
                                ViewBag.id6 = "---";
                                ViewBag.totaldatos6 = "---";
                                ViewBag.promedio6 = "---";
                                ViewBag.varianza6 = "---";
                                ViewBag.desviacion6 = "---";

                                ViewBag.maximo5 = "---";
                                ViewBag.minimo5 = "---";
                                ViewBag.id5 = "---";
                                ViewBag.totaldatos5 = "---";
                                ViewBag.promedio5 = "---";
                                ViewBag.varianza5 = "---";
                                ViewBag.desviacion5 = "---";

                                ViewBag.maximo4 = "---";
                                ViewBag.minimo4 = "---";
                                ViewBag.id4 = "---";
                                ViewBag.totaldatos4 = "---";
                                ViewBag.promedio4 = "---";
                                ViewBag.varianza4 = "---";
                                ViewBag.desviacion4 = "---";

                                ViewBag.maximo3 = "---";
                                ViewBag.minimo3 = "---";
                                ViewBag.id3 = "---";
                                ViewBag.totaldatos3 = "---";
                                ViewBag.promedio3 = "---";
                                ViewBag.varianza3 = "---";
                                ViewBag.desviacion3 = "---";
                            }

                        }//if2
                        else
                        {
                            //mandar 2,3,4,5,6 a 0
                            ViewBag.maximo6 = "---";
                            ViewBag.minimo6 = "---";
                            ViewBag.id6 = "---";
                            ViewBag.totaldatos6 = "---";
                            ViewBag.promedio6 = "---";
                            ViewBag.varianza6 = "---";
                            ViewBag.desviacion6 = "---";

                            ViewBag.maximo5 = "---";
                            ViewBag.minimo5 = "---";
                            ViewBag.id5 = "---";
                            ViewBag.totaldatos5 = "---";
                            ViewBag.promedio5 = "---";
                            ViewBag.varianza5 = "---";
                            ViewBag.desviacion5 = "---";

                            ViewBag.maximo4 = "---";
                            ViewBag.minimo4 = "---";
                            ViewBag.id4 = "---";
                            ViewBag.totaldatos4 = "---";
                            ViewBag.promedio4 = "---";
                            ViewBag.varianza4 = "---";
                            ViewBag.desviacion4 = "---";

                            ViewBag.maximo3 = "---";
                            ViewBag.minimo3 = "---";
                            ViewBag.id3 = "---";
                            ViewBag.totaldatos3 = "---";
                            ViewBag.promedio3 = "---";
                            ViewBag.varianza3 = "---";
                            ViewBag.desviacion3 = "---";

                            ViewBag.maximo2 = "---";
                            ViewBag.minimo2 = "---";
                            ViewBag.id2 = "---";
                            ViewBag.totaldatos2 = "---";
                            ViewBag.promedio2 = "---";
                            ViewBag.varianza2 = "---";
                            ViewBag.desviacion2 = "---";
                        }
                        //unidades de graficos

                        var id_medida = (from pieza in db.Piezas where pieza.Id == reg1 select pieza.UnidadId).Single();
                        var id_tipo_unidad = (from id_unidad in db.Unidades where id_unidad.Id == id_medida select id_unidad.TipoUnidadId).Single();
                        var tip_unidad = (from tipo in db.Unidades where tipo.Id == id_medida select tipo.Nombre).Single();
                        string unidad_completa = tip_unidad;
                        string[] unidades = unidad_completa.Split('/');
                        ViewBag.nombre_unidad = unidades[0];

                        //unidades de graficos



                        Debug.WriteLine(vectores[0]);
                        ViewBag.medicion1 = vectores[0];
                        if (id_piezas1.Count >= 2)
                        {
                            ViewBag.medicion2 = vectores[1];
                            if (id_piezas1.Count >= 3)
                            {
                                ViewBag.medicion3 = vectores[2];
                                if (id_piezas1.Count >= 4)
                                {
                                    ViewBag.medicion4 = vectores[3];
                                    if (id_piezas1.Count >= 5)
                                    {
                                        ViewBag.medicion5 = vectores[4];
                                        if (id_piezas1.Count >= 6)
                                        {
                                            ViewBag.medicion6 = vectores[5];
                                        }
                                        else
                                        {
                                            ViewBag.medicion6 = "[[\'01/01/2012 00:00:00\',0]]";
                                        }
                                    }
                                    else
                                    {
                                        ViewBag.medicion5 = "[[\'01/01/2012 00:00:00\',0]]";
                                        ViewBag.medicion6 = "[[\'01/01/2012 00:00:00\',0]]";

                                    }
                                }
                                else
                                {
                                    ViewBag.medicion4 = "[[\'01/01/2012 00:00:00\',0]]";
                                    ViewBag.medicion5 = "[[\'01/01/2012 00:00:00\',0]]";
                                    ViewBag.medicion6 = "[[\'01/01/2012 00:00:00\',0]]";
                                }
                            }
                            else
                            {
                                ViewBag.medicion3 = "[[\'01/01/2012 00:00:00\',0]]";
                                ViewBag.medicion4 = "[[\'01/01/2012 00:00:00\',0]]";
                                ViewBag.medicion5 = "[[\'01/01/2012 00:00:00\',0]]";
                                ViewBag.medicion6 = "[[\'01/01/2012 00:00:00\',0]]";
                            }

                        }//fin if2
                        else
                        {
                            ViewBag.medicion2 = "[[\'01/01/2012 00:00:00\',0]]";
                            ViewBag.medicion3 = "[[\'01/01/2012 00:00:00\',0]]";
                            ViewBag.medicion4 = "[[\'01/01/2012 00:00:00\',0]]";
                            ViewBag.medicion5 = "[[\'01/01/2012 00:00:00\',0]]";
                            ViewBag.medicion6 = "[[\'01/01/2012 00:00:00\',0]]";
                        }
   

                    return View();
                }
                catch
                {
                    Response.Redirect(Url.Action("../reporte/SinInformacion"));
                    return null;
                }
            }
            else
            {
                ViewBag.area = new SelectList(db.Plantas, "Id", "Nombre");
                ViewBag.region = new SelectList(db.Regiones, "Id", "Nombre");
                ViewBag.empresa = new SelectList(db.Empresas, "Id", "Nombre");
                return View("reporteambiental", ambiental);
            }
            

        }

        public ActionResult grafico_reporte()
        {

            return View();
        }

        [HttpPost]
        public ActionResult grafico_reporte(string imag_grafico, string imag_grafico1, string imag_grafico2,string imag_grafico3,string imag_grafico4,string imag_grafico5, CReporteAmbiental info_dato, bool estado_reporte)
        {
            ReporteAmbientalPDF doc = new ReporteAmbientalPDF();
            DateTime fecha_final = DateTime.Now; 
            string fecha_generacion = fecha_final.ToString("ddMMyyyy HHmmss");

            DateTime fechaI = Convert.ToDateTime(info_dato.fechaInicio);
            DateTime fechaF = Convert.ToDateTime(info_dato.fechaFin);
            int area_reporte = info_dato.area;

            string imagen = imag_grafico;
            string[] temp = imagen.Split(',');
            ViewBag.imagen = temp[1];
            System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Convert.FromBase64String(temp[1]));

            string imagen1 = imag_grafico1;
            string[] temp1 = imagen1.Split(',');
            System.IO.MemoryStream ms1 = new System.IO.MemoryStream(System.Convert.FromBase64String(temp1[1]));

            string imagen2 = imag_grafico2;
            string[] temp2 = imagen2.Split(',');
            System.IO.MemoryStream ms2 = new System.IO.MemoryStream(System.Convert.FromBase64String(temp2[1]));

            string imagen3 = imag_grafico3;
            string[] temp3 = imagen3.Split(',');
            System.IO.MemoryStream ms3 = new System.IO.MemoryStream(System.Convert.FromBase64String(temp3[1]));

            string imagen4 = imag_grafico4;
            string[] temp4 = imagen4.Split(',');
            System.IO.MemoryStream ms4 = new System.IO.MemoryStream(System.Convert.FromBase64String(temp4[1]));

            var instalaciones = (from instalacion in db.Instalaciones where instalacion.PlantaId == info_dato.area select instalacion.Id);
            ArrayList ids = new ArrayList();
            foreach (int id in instalaciones)
            {
                ids.Add(id);
            }
            ArrayList i_equipos = new ArrayList();
            foreach (int id in ids)
            {

                var id_equipos = (from equipo in db.Equipos where equipo.InstalacionId == id && equipo.SistemaId == 2 select equipo.Id);
                foreach (int d in id_equipos)
                {
                    i_equipos.Add(d);
                }
            }

            ArrayList id_piezas1 = new ArrayList();
            foreach (int id_equipo in i_equipos)
            {
                var id_eq_pieza = (from equipos_p in db.EquiposPiezas where equipos_p.EquipoId == id_equipo select equipos_p.PiezaId);
                foreach (int val in id_eq_pieza)
                {
                    id_piezas1.Add(val);
                    Debug.WriteLine(val.ToString());
                }
            }

            DateTime fechaMax = new DateTime();
            string datos = "";
            ArrayList vectores = new ArrayList();
            ArrayList contenedor_estadisticas = new ArrayList();
            foreach (int dato_id in id_piezas1)
            {
                CReporteAmbiental temporal = new CReporteAmbiental();
                List<Medicion> mediciones = db.Mediciones.Where(m => m.Fecha >= fechaI
                            && m.Fecha <= fechaF && m.PiezaId == dato_id && m.RegistroMedida == "F").ToList<Medicion>();
                decimal maximo = (decimal)(from mediciones1 in db.Mediciones
                                           where mediciones1.Fecha >= fechaI
                                               && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == dato_id
                                           select mediciones1.Valor).Max();
                decimal minimo = (decimal)(from mediciones1 in db.Mediciones
                                           where mediciones1.Fecha >= fechaI
                                               && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == dato_id
                                           select mediciones1.Valor).Min();
                float max = (float) maximo;
                fechaMax = (from mediciones1 in db.Mediciones
                                       where mediciones1.Fecha >= fechaI
                                       && mediciones1.Fecha <= fechaF
                                       && mediciones1.PiezaId == dato_id
                                       && mediciones1.Valor == max
                                       select mediciones1.Fecha).ToArray<DateTime>()[0];
                datos = "[";
                foreach (Medicion medicion in mediciones)
                {
                    datos += "[\'" + medicion.Fecha.ToString("dd/MM/yyyy HH:MM:ss") + "\'," + medicion.Valor.ToString() + "],";
                }
                decimal valor_suma = 0.000M;
                int n = 0;
                foreach (Medicion medicion in mediciones)
                {
                    valor_suma += (decimal)medicion.Valor;
                    n++;
                }
                decimal promedio = valor_suma / n;
                decimal valor_cuadrado = 0.000M;
                n = 0;
                foreach (Medicion medicion in mediciones)
                {
                    valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                    n++;
                }
                decimal varianza = valor_cuadrado / n;
                decimal desviacion_est = (decimal)Math.Sqrt((double)varianza);

                string[] nombre_pieza = (from equipo in db.Piezas
                                       where equipo.Id == dato_id
                                       select equipo.Nombre).ToArray<string>();
                datos = datos.TrimEnd(',') + "]";
                vectores.Add(datos);
                temporal.fechaInicio = fechaI.ToString();
                temporal.fechaFin = fechaF.ToString();
                temporal.equipo_id = dato_id.ToString();
                temporal.equipo_nombre = nombre_pieza[0];
                temporal.area = area_reporte;

                // Para definir cantidad de decimales, hacerlo en el toString()
                // Por ejemplo, 4 decimales sería numero.ToString("#.00");
                temporal.maximo = ((Int32)(decimal.Round(maximo, 0))).ToString();
                temporal.minimo = ((Int32)(decimal.Round(minimo, 0))).ToString();
                temporal.promedio = ((Int32)(decimal.Round(promedio, 0))).ToString();
                temporal.varianza = ((Int32)(decimal.Round(varianza, 0))).ToString();
                temporal.desviacion = ((Int32)(decimal.Round(desviacion_est, 0))).ToString();
                temporal.num_muestra = n.ToString();
                contenedor_estadisticas.Add(temporal);
            }

            ReporteAmbiental xmlamb = new ReporteAmbiental();
            byte[] salida_doc = null;
            //InformeEmergenciaFijo informe = new InformeEmergenciaFijo();
            //informe.crearPDF();
            if (estado_reporte == true)
            {
                string ruta = Path.Combine(Server.MapPath(ConfigurationManager.AppSettings["PathReporteAmbiental"]), "reporteAmb " + fecha_generacion + ".pdf");
                string ruta1 = Path.Combine(Server.MapPath(ConfigurationManager.AppSettings["PathReporteAmbiental"]), "reporteAmb " + fecha_generacion + ".xml");
               /********************************************************************************************
                ***********************************************************************************************
                *************************************************************************************************/

                salida_doc = doc.reporteAmbPDF(ruta,fecha_generacion, contenedor_estadisticas, fechaI.ToString("dd/MM/yyyy"), fechaF.ToString("dd/MM/yyyy"), ms, ms1, ms2,ms3,ms4, fechaMax);
                
                /********************************************************************************************
                 ***********************************************************************************************
                 *************************************************************************************************/
                
                xmlamb.CrearReporteVacioAmb(ruta1,fecha_generacion);
                xmlamb.llenar_reporteAmb(ruta1,fecha_generacion, contenedor_estadisticas, fechaI.ToString("dd/MM/yyyy"), fechaF.ToString("dd/MM/yyyy"), temp[1], temp1[1], temp2[1],temp3[1],temp4[1]);
                reportes_generados reporte_final = new reportes_generados();
                int id_user = (from usuarios in db.Usuarios where usuarios.Nombre == HttpContext.User.Identity.Name select usuarios.Id).Single();
                foreach (int dato_id in id_piezas1)
                {
                    reporte_final.fecha_inicio = fechaI;
                    reporte_final.fecha_fin = fechaF;
                    reporte_final.fecha_generacion = fecha_final;
                    reporte_final.nombre = "ReporteAmb" + fecha_generacion + ".pdf";
                    reporte_final.pieza_id = dato_id;
                    reporte_final.usuario_id = id_user;
                    db.reportes_generados.Add(reporte_final);
                    db.SaveChanges();
                }
            }
            else
            {
                salida_doc = doc.reporteAmbPDFNoOf(fecha_generacion, contenedor_estadisticas, fechaI.ToString("dd/MM/yyyy"), fechaF.ToString("dd/MM/yyyy"), ms, ms1, ms2,ms3,ms4, fechaMax);
            }
            return File(salida_doc, "application/pdf", "ReporteAmb" + fecha_generacion + ".pdf");

        }



        public ActionResult reporteporequipo(int? idPieza, int? idEquipo, int? idInstalacion, int? idArea, int? idEmpresa, int? idRegion) 
        {
            if (idPieza != null && idEquipo != null && idInstalacion != null && idArea != null && idEmpresa != null && idRegion != null)
            {
                ViewBag.idPieza = idPieza;
                ViewBag.idEquipo = idEquipo;
                ViewBag.idInstalacion = idInstalacion;
                ViewBag.idArea = idArea;
                ViewBag.idRegion = idRegion;
                ViewBag.idEmpresa = idEmpresa;
                ViewBag.bloqueo = 1;
                ViewBag.equipo_id = new SelectList(db.Piezas, "Id", "Nombre", idPieza);
                ViewBag.gabinete = new SelectList(db.Equipos, "Id", "Nombre", idEquipo);
                ViewBag.instalacion = new SelectList(db.Instalaciones, "Id", "Nombre", idInstalacion);
                ViewBag.area = new SelectList(db.Plantas, "Id", "Nombre", idArea);
                ViewBag.region = new SelectList(db.Regiones, "Id", "Nombre", idRegion);
                ViewBag.empresa = new SelectList(db.Empresas, "Id", "Nombre", idEmpresa);
            }
            else
            {
                ViewBag.bloqueo = 0;
                ViewBag.idPieza = 0;
                ViewBag.idEquipo = 0;
                ViewBag.idInstalacion = 0;
                ViewBag.idArea = 0;
                ViewBag.idRegion = 0;
                ViewBag.idEmpresa = 0;
                ViewBag.equipo_id = new SelectList(db.Piezas, "Id", "Nombre");
                ViewBag.gabinete = new SelectList(db.Equipos, "Id", "Nombre");
                ViewBag.instalacion = new SelectList(db.Instalaciones, "Id", "Nombre");
                ViewBag.area = new SelectList(db.Plantas, "Id", "Nombre");
                ViewBag.region = new SelectList(db.Regiones, "Id", "Nombre");
                ViewBag.empresa = new SelectList(db.Empresas, "Id", "Nombre");
            }
            return View();
        }

        #region Cascada Dropdown


        public ActionResult getPlantasPorEmpresa(string empresa)
        {
            int emp1 = Int32.Parse(empresa);
            IEnumerable<Planta> iPlantas = (from planta in db.Plantas
                                            where planta.EmpresaId == emp1
                                            select planta).ToList<Planta>();
            if (iPlantas == null)
                throw new ArgumentException("La Empresa no es correcta");

            List<SelectListItem> slPlantas = new List<SelectListItem>();

            foreach (Planta p in iPlantas)
            {
                slPlantas.Add(new SelectListItem { Text = p.Nombre, Value = p.Id.ToString() });
            }


            return Json(slPlantas, JsonRequestBehavior.AllowGet);
        }




        public ActionResult getInstalacionesPorPlanta(string planta)
        {
            int idPlanta = Int32.Parse(planta);
            IEnumerable<Instalacion> iInstalaciones = (from instalaciones in db.Instalaciones
                                                       where instalaciones.PlantaId == idPlanta
                                                       select instalaciones).ToList<Instalacion>();
            if (iInstalaciones == null)
                throw new ArgumentException("La planta no es correcta");
            List<SelectListItem> slInstalaciones = new List<SelectListItem>();

            foreach (Instalacion instalacion in iInstalaciones)
            {
                slInstalaciones.Add(new SelectListItem { Value = instalacion.Id.ToString(), Text = instalacion.Nombre });
            }

            return Json(slInstalaciones, JsonRequestBehavior.AllowGet);
        }



        public ActionResult getEquiposPorInstalacion(string instalacion)
        {
            int idInstalacion = Int32.Parse(instalacion);
            IEnumerable<Equipo> iEquipos = (from equipos in db.Equipos
                                            where equipos.InstalacionId == idInstalacion
                                            select equipos).ToList<Equipo>();
            if (iEquipos == null)
                throw new ArgumentException("La instalación no es correcta");

            List<SelectListItem> slEquipos = new List<SelectListItem>();
            foreach(Equipo equipo in iEquipos)
            {
                slEquipos.Add(new SelectListItem { Text = equipo.Nombre, Value = equipo.Id.ToString() });
            }
            return Json(slEquipos, JsonRequestBehavior.AllowGet);
        }

        public ActionResult getDetectoresPorEquipo(string equipo)
        {
            int idEquipo = Int32.Parse(equipo);
            IEnumerable<Pieza> iEquiPieza = (from equipiezas in db.EquiposPiezas
                                             where equipiezas.EquipoId == idEquipo
                                             select equipiezas.Pieza).ToList<Pieza>();
            if (iEquiPieza == null)
                throw new ArgumentException("El equipo no es correcto");
            List<SelectListItem> slEquiPieza = new List<SelectListItem>();
            foreach (Pieza pieza in iEquiPieza)
            {
                slEquiPieza.Add(new SelectListItem { Value = pieza.Id.ToString(), Text = pieza.Nombre });
            }

            return Json(slEquiPieza, JsonRequestBehavior.AllowGet);
        }

        #endregion



        public ActionResult reporte1(ReporteSEPRO rep) {

            if (ModelState.IsValid)
            {
                try
                {
                    DateTime fechaI = Convert.ToDateTime(rep.fechaInicio);
                    DateTime fechaF = Convert.ToDateTime(rep.fechaFin);
                    int xvalor = Convert.ToInt32(rep.equipo_id);
                    var id_medida = (from pieza in db.Piezas where pieza.Id == xvalor select pieza.UnidadId).Single();
                    var id_tipo_unidad = (from id_unidad in db.Unidades where id_unidad.Id == id_medida select id_unidad.TipoUnidadId).Single();
                    var tip_unidad = (from tipo in db.Unidades where tipo.Id == id_medida select tipo.Nombre).Single();
                    string unidad_completa = tip_unidad;
                    string[] unidades = unidad_completa.Split('/');
                    ViewBag.nombre_unidad = unidades[0];
                    List<Medicion> mediciones = db.Mediciones.Where(m => m.Fecha >= fechaI
                                   && m.Fecha <= fechaF && m.PiezaId == xvalor).ToList<Medicion>();

                    decimal maximo = (decimal)(from mediciones1 in db.Mediciones
                                               where mediciones1.Fecha >= fechaI
                                                   && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == xvalor
                                               select mediciones1.Valor).Max();
                    decimal minimo = (decimal)(from mediciones1 in db.Mediciones
                                               where mediciones1.Fecha >= fechaI
                                                   && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == xvalor
                                               select mediciones1.Valor).Min();
                    ViewBag.maximo = maximo.ToString();
                    ViewBag.minimo = minimo.ToString();

                    int r = 0;
                    string[] tempo1 = new string[mediciones.Count];
                    DateTime[] fechas = new DateTime[mediciones.Count];
                    float[] valores_med = new float[mediciones.Count];

                    foreach (Medicion medicion in mediciones)
                    {
                        valores_med[r] = (float)medicion.Valor;
                        fechas[r] = medicion.Fecha;
                        r++;
                    }

                    decimal[] dif_t = new decimal[mediciones.Count];
                    for (int i = 0; i < fechas.Length - 1; i++)
                    {
                        TimeSpan diferencia = fechas[i + 1].Subtract(fechas[i]);
                        dif_t[i] = Convert.ToDecimal(diferencia.TotalHours.ToString("#.000000000"));
                    }

                    decimal resultado = 00000000000000.000000000000000000000M;
                    for (int i = 0; i < valores_med.Length - 1; i++)
                    {
                        if (valores_med[i] < valores_med[i + 1] || valores_med[i] == valores_med[i + 1])
                        {
                            decimal a = (decimal)(valores_med[i]);
                            decimal b = (dif_t[i]);
                            decimal c = (decimal)(Math.Abs(valores_med[i + 1] - valores_med[i]));

                            resultado += (a * b) + (0.5M * (c) * (b));
                        }
                        else
                        {
                            decimal a = (decimal)(valores_med[i + 1]);
                            decimal b = (dif_t[i]);
                            decimal c = (decimal)(Math.Abs(valores_med[i + 1] - valores_med[i]));
                            resultado += (a * b) + (0.5M * (c) * (b));
                        }
                    }
                    decimal valor_suma = 0.000M;
                    int n = 0;
                    foreach (Medicion medicion in mediciones)
                    {
                        valor_suma += (decimal)medicion.Valor;
                        n++;
                    }
                    decimal promedio = valor_suma / n;
                    decimal valor_cuadrado = 0.000M;
                    n = 0;
                    foreach (Medicion medicion in mediciones)
                    {
                        valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                        n++;
                    }
                    decimal varianza = valor_cuadrado / n;
                    decimal desviacion_est = (decimal)Math.Sqrt((double)varianza);
                    int registros_validos = (from mediciones1 in db.Mediciones
                                             where mediciones1.Fecha >= fechaI
                                                 && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == xvalor
                                             select mediciones1.Valor).Count();
                    int registros_falla = (from mediciones1 in db.FallasMediciones
                                           where mediciones1.Fecha >= fechaI
                                               && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == xvalor
                                           select mediciones1.Valor).Count();
                    string datos = "[";
                    string medi;
                    string valor_med;
                    foreach (Medicion medicion in mediciones)
                    {
                        medi = medicion.Valor.ToString();
                        valor_med = medi.Replace(",", ".");
                        datos += "[\'" + medicion.Fecha.ToString("yyyy/MM/dd HH:MM:ss") + "\'," + valor_med + "],";
                    }
                    datos = datos.TrimEnd(',') + "]";
                    ViewBag.datos = datos;
                    decimal porcentaje_falla = ((decimal)registros_falla / (decimal)registros_validos) * 100M;
                    ViewBag.diasNoOP = porcentaje_falla.ToString("#.00");
                    ViewBag.num_muestra = n.ToString();
                    ViewBag.promedio = promedio.ToString("#.00");
                    ViewBag.varianza = varianza.ToString("#.00");
                    ViewBag.desviacion = desviacion_est.ToString("#.00");
                    ViewBag.dosis = resultado.ToString("#.00");
                    int id_punto = (from equipos_piezas in db.EquiposPiezas where equipos_piezas.PiezaId == xvalor select equipos_piezas.EquipoId).Single();
                    string st_punto = (from equipos_piezas in db.EquiposPiezas where equipos_piezas.PiezaId == xvalor select equipos_piezas.Equipo.Nombre).Single();
                    int declaracion_nivel = (int)(from pieza in db.Piezas where pieza.Id == xvalor select pieza.NivelDeclaracionAlarmaId).Single();
                    int id_inst = (from equipos in db.Equipos where equipos.Id == id_punto select equipos.InstalacionId).Single();
                    bool vigencia = (from equipos in db.Equipos where equipos.Id == id_punto select equipos.Vigencia).Single();
                    string instalacion1 = (from instalacion in db.Instalaciones where instalacion.Id == id_inst select instalacion.Nombre).Single();
                    string detector = (from eqipo_pieza in db.Piezas where eqipo_pieza.Id == xvalor select eqipo_pieza.Nombre).Single();
                    string val_operacion = (from seteo in db.NivelesDeclaracionesAlarmas where seteo.Id == declaracion_nivel select seteo.ValorRegistro).Single().ToString();
                    string val_intervencion = (from seteo in db.NivelesDeclaracionesAlarmas where seteo.Id == declaracion_nivel select seteo.ValorInvestigacion).Single().ToString();
                    string val_investigacion = (from seteo in db.NivelesDeclaracionesAlarmas where seteo.Id == declaracion_nivel select seteo.ValorIntervencion).Single().ToString();
                    //int id_mantencion = (from equip in db.equipos where equip.Id == id_punto select equip.estado_mantencion_id).Single();
                    /*raro*/
                    //int id_calibracion1 = (int)(from equip1 in db.equipos where equip1.Id == id_punto select equip1.estado_calibracion_id).Single();
                    //string mantencion = (from manten in db.estados_mantenciones where manten.estado_mantencion_id == id_mantencion select manten.nombre).Single();
                    //string calibracion = (from calib in db.estados_calibraciones where calib.Id == id_calibracion1 select calib.vencimiento).Single().ToString("MM-dd-yyyy");
                    ViewBag.instalacion = instalacion1;
                    ViewBag.detector = detector;
                    //ViewBag.id = id_punto;
                    ViewBag.id = st_punto;
                    ViewBag.proceso = rep.proceso;
                    ViewBag.verificacion = rep.verificacion;
                    ViewBag.operacion = val_operacion;
                    ViewBag.investigacion = val_investigacion;
                    ViewBag.intervencion = val_intervencion;
                    ViewBag.mantencion = "---";
                    ViewBag.calibracion = "---";
                    if (vigencia == true)
                    {
                        ViewBag.estado = "Vigente";
                    }
                    else
                    {
                        ViewBag.estado = "NO Vigente";
                    }

                    return PartialView();
                }
                catch
                {
                    Response.Redirect(Url.Action("../reporte/SinInformacion"));
                    return null;
                }
            }
            else
            {/*
                ViewBag.idPieza = rep.equipo_id;
                ViewBag.idEquipo = rep.gabinete;
                ViewBag.idInstalacion = rep.instalacion;
                ViewBag.idArea = rep.area;
                ViewBag.idRegion = rep.region;
                ViewBag.idEmpresa = rep.empresa;*/
                ViewBag.equipo_id = new SelectList(db.Piezas, "Id", "Nombre");
                ViewBag.gabinete = new SelectList(db.Equipos, "Id", "Nombre");
                ViewBag.instalacion = new SelectList(db.Instalaciones, "Id", "Nombre");
                ViewBag.area = new SelectList(db.Plantas, "Id", "Nombre");
                ViewBag.region = new SelectList(db.Regiones, "Id", "Nombre");
                ViewBag.empresa = new SelectList(db.Empresas, "Id", "Nombre");
                return View("reporteporequipo", rep);
            }
        }

        public ActionResult reporte2() {

            return View();
        }



        [HttpPost]
        public ActionResult reporte2(ReporteSEPRO rep1, string imagen_grafico, string imagen_grafico1, bool estado_reporte)
        {
            string imagen = imagen_grafico;
            string[] temp = imagen.Split(',');
            ViewBag.imagen = temp[1];
            System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Convert.FromBase64String(temp[1]));
            //System.Drawing.Image.FromStream(ms);
            string imagen1 = imagen_grafico1;
            string[] temp1 = imagen1.Split(',');
            System.IO.MemoryStream ms1 = new System.IO.MemoryStream(System.Convert.FromBase64String(temp1[1]));
            DateTime fechaI = Convert.ToDateTime(rep1.fechaInicio);
            DateTime fechaF = Convert.ToDateTime(rep1.fechaFin);
            int xvalor = Convert.ToInt32(rep1.equipo_id);
            var id_medida = (from pieza in db.Piezas where pieza.Id == xvalor select pieza.UnidadId).Single();
            var id_tipo_unidad = (from id_unidad in db.Unidades where id_unidad.Id == id_medida select id_unidad.TipoUnidadId).Single();
            var tip_unidad = (from tipo in db.Unidades where tipo.Id == id_medida select tipo.Nombre).Single();
            string unidad_completa = tip_unidad;

            List<Medicion> mediciones = db.Mediciones.Where(m => m.Fecha >= fechaI
                           && m.Fecha <= fechaF && m.PiezaId == xvalor).ToList<Medicion>();

            decimal maximo = (decimal)(from mediciones1 in db.Mediciones
                                       where mediciones1.Fecha >= fechaI
                                           && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == xvalor
                                       select mediciones1.Valor).Max();
            decimal minimo = (decimal)(from mediciones1 in db.Mediciones
                                       where mediciones1.Fecha >= fechaI
                                           && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == xvalor
                                       select mediciones1.Valor).Min();
            rep1.maximo = maximo.ToString();
            rep1.minimo = minimo.ToString();

            int r = 0;
            string[] tempo1 = new string[mediciones.Count];
            DateTime[] fechas = new DateTime[mediciones.Count];
            float[] valores_med = new float[mediciones.Count];

            foreach (Medicion medicion in mediciones)
            {
                valores_med[r] = (float)medicion.Valor;
                fechas[r] = medicion.Fecha;
                r++;
            }

            decimal[] dif_t = new decimal[mediciones.Count];
            for (int i = 0; i < fechas.Length - 1; i++)
            {
                TimeSpan diferencia = fechas[i + 1].Subtract(fechas[i]);
                dif_t[i] = Convert.ToDecimal(diferencia.TotalHours.ToString("#.00000000000"));
            }

            decimal resultado = 00000000000000.000000000000000000000M;
            for (int i = 0; i < valores_med.Length - 1; i++)
            {
                if (valores_med[i] < valores_med[i + 1] || valores_med[i] == valores_med[i + 1])
                {
                    decimal a = (decimal)(valores_med[i]);
                    decimal b = (dif_t[i]);
                    decimal c = (decimal)(Math.Abs(valores_med[i + 1] - valores_med[i]));

                    resultado += (a * b) + (0.5M * (c) * (b));
                }
                else
                {
                    decimal a = (decimal)(valores_med[i + 1]);
                    decimal b = (dif_t[i]);
                    decimal c = (decimal)(Math.Abs(valores_med[i + 1] - valores_med[i]));
                    resultado += (a * b) + (0.5M * (c) * (b));
                }
            }
            decimal valor_suma = 0.000M;
            int n = 0;
            foreach (Medicion medicion in mediciones)
            {
                valor_suma += (decimal)medicion.Valor;
                n++;
            }
            decimal promedio = valor_suma / n;
            decimal valor_cuadrado = 0.000M;
            n = 0;
            foreach (Medicion medicion in mediciones)
            {
                valor_cuadrado += (decimal)Math.Pow(((double)medicion.Valor - (double)promedio), 2);
                n++;
            }
            decimal varianza = valor_cuadrado / n;
            decimal desviacion_est = (decimal)Math.Sqrt((double)varianza);
            int registros_validos = (from mediciones1 in db.Mediciones
                                     where mediciones1.Fecha >= fechaI
                                         && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == xvalor
                                     select mediciones1.Valor).Count();
            int registros_falla = (from mediciones1 in db.FallasMediciones
                                   where mediciones1.Fecha >= fechaI
                                       && mediciones1.Fecha <= fechaF && mediciones1.PiezaId == xvalor
                                   select mediciones1.Valor).Count();

            decimal porcentaje_falla = ((decimal)registros_falla / (decimal)registros_validos) * 100M;
            rep1.diasNoOP = porcentaje_falla.ToString("#.00");

            rep1.num_muestra = n.ToString();
            rep1.promedio = promedio.ToString("#.00");
            rep1.varianza = varianza.ToString("#.00");
            rep1.desviacion = desviacion_est.ToString("#.00");
            rep1.dosis = resultado.ToString("#.00");


            int id_punto = (from equipos_piezas in db.EquiposPiezas where equipos_piezas.PiezaId == xvalor select equipos_piezas.EquipoId).Single();
            int declaracion_nivel = (int)(from pieza in db.Piezas where pieza.Id == xvalor select pieza.NivelDeclaracionAlarmaId).Single();
            int id_inst = (from equipos in db.Equipos where equipos.Id == id_punto select equipos.InstalacionId).Single();
            bool vigencia = (from equipos in db.Equipos where equipos.Id == id_punto select equipos.Vigencia).Single();
            string instalacion1 = (from instalacion in db.Instalaciones where instalacion.Id == id_inst select instalacion.Nombre).Single();
            string detector = (from eqipo_pieza in db.Piezas where eqipo_pieza.Id == xvalor select eqipo_pieza.Nombre).Single();
            string val_operacion = (from seteo in db.NivelesDeclaracionesAlarmas where seteo.Id == declaracion_nivel select seteo.ValorRegistro).Single().ToString();
            string val_intervencion = (from seteo in db.NivelesDeclaracionesAlarmas where seteo.Id == declaracion_nivel select seteo.ValorInvestigacion).Single().ToString();
            string val_investigacion = (from seteo in db.NivelesDeclaracionesAlarmas where seteo.Id == declaracion_nivel select seteo.ValorIntervencion).Single().ToString();
            //int id_mantencion = (from equip in db.equipos where equip.Id == id_punto select equip.estado_mantencion_id).Single();
            /*raro*/
            //int id_calibracion1 = (int)(from equip1 in db.equipos where equip1.Id == id_punto select equip1.estado_calibracion_id).Single();
            //string mantencion = (from manten in db.estados_mantenciones where manten.estado_mantencion_id == id_mantencion select manten.nombre).Single();
            //string calibracion = (from calib in db.estados_calibraciones where calib.Id == id_calibracion1 select calib.vencimiento).Single().ToString("MM-dd-yyyy");
            rep1.instalacion = instalacion1;
            rep1.detector = detector;
            rep1.operacion = val_operacion;
            rep1.investigacion = val_investigacion;
            rep1.intervencion = val_intervencion;
            rep1.mantencion = "---";
            rep1.calibracion = "---";
            rep1.imagen_puntos = temp[1];
            rep1.imagen_dosis = temp1[1];
            if (vigencia == true)
            {
                rep1.estado = "Vigente";
            }
            else
            {
                rep1.estado = "NO Vigente";
            }
            DateTime fecha_final= DateTime.Now;
            string fecha_generacion=fecha_final.ToString("ddMMyyyy HHmmss");

            ReporteFijo reporte = new ReporteFijo();
            CrearPDF documento = new CrearPDF();
            byte[] salida_doc = null;
            //InformeEmergenciaFijo informe = new InformeEmergenciaFijo();
            //informe.crearPDF();
            if (estado_reporte == true)
            {
               // InsertaReporte reporte_final= new InsertaReporte();
                string ruta = Path.Combine(Server.MapPath(ConfigurationManager.AppSettings["PathReporteFijo"]), "reporte" + fecha_generacion + ".pdf");
                string ruta1 = Path.Combine(Server.MapPath(ConfigurationManager.AppSettings["PathReporteFijo"]), "reporte" + fecha_generacion + ".xml");
                  
                salida_doc = documento.crearPDF(ruta,rep1, ms, ms1, unidad_completa, fecha_generacion);
                reporte.CrearReporteVacio(ruta1,fecha_generacion);
                reporte.llenar_reporte(ruta1,fecha_generacion, rep1, ms, ms1);
                reportes_generados reporte_final = new reportes_generados();
                int id_user = (from usuarios in db.Usuarios where usuarios.Nombre == HttpContext.User.Identity.Name select usuarios.Id).Single();
                reporte_final.fecha_inicio=fechaI;
                reporte_final.fecha_fin= fechaF;
                reporte_final.fecha_generacion=fecha_final;
                reporte_final.nombre="reporte" + fecha_generacion + ".pdf";
                reporte_final.pieza_id=xvalor;
                reporte_final.usuario_id=id_user;

                db.reportes_generados.Add(reporte_final);
                db.SaveChanges();

            }
            else {
                salida_doc = documento.crearPDFNoOf(rep1, ms, ms1, unidad_completa, fecha_generacion);
            }
            
            return File(salida_doc, "application/pdf", fecha_generacion + ".pdf");
            
        }

        public ActionResult SinInformacion() {
            return View();
        
        }

        public ActionResult reportealarmas1(ReporteAlarmas rep)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    DateTime fechaI = Convert.ToDateTime(rep.fechaInicio);
                    DateTime fechaF = Convert.ToDateTime(rep.fechaFin);
                    int instalacionInt = Int32.Parse(rep.instalacion);
                    var instalacion1 = (from instalacion in db.Instalaciones where instalacion.Id == instalacionInt select instalacion.Nombre).Single();
                    string instalacionStr = instalacion1.ToString();
                    int[] listaequipos = (from equipo in db.Equipos where equipo.InstalacionId == instalacionInt select equipo.Id).ToArray<int>();
                    int[] listapiezas = (from equipieza in db.EquiposPiezas where listaequipos.Contains(equipieza.EquipoId) select equipieza.PiezaId).ToArray<int>();
                    List<Alarma> listaalarmas = (from alarma in db.Alarmas
                                                 where listapiezas.Contains(alarma.PiezaId)
                                                 && alarma.Fecha >= fechaI
                                                 && alarma.Fecha <= fechaF
                                                 && alarma.NivelAlarma.Id > 1
                                                 select alarma).ToList<Alarma>();
                    List<Alarma> listaalarmaE = (from alarma in db.Alarmas
                                                 where listapiezas.Contains(alarma.PiezaId)
                                                 && alarma.Fecha >= fechaI
                                                 && alarma.Fecha <= fechaF
                                                 && alarma.EstadoEnergiaId == 2
                                                 select alarma).ToList<Alarma>();

                    List<FallaMedicion> listafallas = (from falla in db.FallasMediciones
                                                       where listapiezas.Contains(falla.PiezaId)
                                                       && falla.Fecha >= fechaI
                                                       && falla.Fecha <= fechaF
                                                       select falla).ToList<FallaMedicion>();


                    ReporteFijo reporte = new ReporteFijo();
                    CrearPDF documento = new CrearPDF();
                    byte[] salida_doc = null;

                    salida_doc = documento.crearPDFAlarmas(rep, instalacionStr, listaalarmas, listaalarmaE, listafallas);

                    return File(salida_doc, "application/pdf", "ReporteAlarmas" + ".pdf");
                }
                catch
                {
                    Response.Redirect(Url.Action("../reporte/SinInformacion"));
                    return null;
                }
            }
            else
            {
                ViewBag.instalacion = new SelectList(db.Instalaciones, "Id", "Nombre");
                return View("reportedealarmas", rep);
            }
        }
   


    }
}
